<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <meta name="author" content="隐星魂 (Roy.Sun)">
        
        <link rel="shortcut icon" href="../../../img/favicon.ico">
        <title>STM32 - 玄武操作系统</title>
        <link href="../../../css/bootstrap.min.css" rel="stylesheet">
        <link href="../../../css/font-awesome.min.css" rel="stylesheet">
        <link href="../../../css/base.css" rel="stylesheet">
        <link rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.3/styles/color-brewer.min.css">

        <script src="../../../js/jquery-1.10.2.min.js" defer></script>
        <script src="../../../js/bootstrap.min.js" defer></script>
        <script src="https://cdn.staticfile.org/highlight.js/10.0.3/highlight.min.js"></script>
        <script>hljs.initHighlightingOnLoad();</script> 
    </head>

    <body>
        <div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
            <div class="container">
                <a class="navbar-brand" href="../../..">玄武操作系统</a>
                <!-- Expander button -->
                <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbar-collapse">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <!-- Expanded navigation -->
                <div id="navbar-collapse" class="navbar-collapse collapse">
                        <!-- Main navigation -->
                        <ul class="nav navbar-nav">
                            <li class="navitem">
                                <a href="../../.." class="nav-link">主页</a>
                            </li>
                            <li class="navitem">
                                <a href="../../../License/" class="nav-link">开源协议</a>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">快速开发指南 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">STM32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../QuickGuide/stm32/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/stm32/02-atkh743/" class="dropdown-item">02-正点原子阿波罗H743开发板上手指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/stm32/03-fk429m/" class="dropdown-item">03-反客F429核心板上手指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/stm32/04-atkf103core/" class="dropdown-item">04-正点原子F103核心板上手指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/stm32/05-atkf407core/" class="dropdown-item">05-正点原子F407核心板上手指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/stm32/06-WeActH750/" class="dropdown-item">06-微行电子H750开发板上手指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/stm32/07-Project-From-Scratch-Guide/" class="dropdown-item">07-自定义工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">GD32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../QuickGuide/gd32/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/gd32/02-Project-Setup-Guide/" class="dropdown-item">02-工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">GD32V</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../QuickGuide/gd32v/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/gd32v/02-Project-Setup-Guide/" class="dropdown-item">02-工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">NXP S32K</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../QuickGuide/s32k/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../../QuickGuide/s32k/02-Project-Setup-Guide/" class="dropdown-item">02-工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">玄武内核模块</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../QuickGuide/xwko/01-XuanWuKO-Guide/" class="dropdown-item">01-上手指南</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">应用手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../../UserManual/00-Index/" class="dropdown-item">0.目录</a>
</li>
                                    
<li>
    <a href="../../../UserManual/01-Brief/" class="dropdown-item">1.简介</a>
</li>
                                    
<li>
    <a href="../../../UserManual/02-Basic-System-Architecture/" class="dropdown-item">2.系统基本架构</a>
</li>
                                    
<li>
    <a href="../../../UserManual/03-Build-System/" class="dropdown-item">3.构建系统</a>
</li>
                                    
<li>
    <a href="../../../UserManual/04-Boot-Flow/" class="dropdown-item">4.启动流程</a>
</li>
                                    
<li>
    <a href="../../../UserManual/05-IRQ/" class="dropdown-item">5.中断控制</a>
</li>
                                    
<li>
    <a href="../../../UserManual/06-SKD/" class="dropdown-item">6.调度器</a>
</li>
                                    
<li>
    <a href="../../../UserManual/07-Thread/" class="dropdown-item">7.线程</a>
</li>
                                    
<li>
    <a href="../../../UserManual/08-SWT/" class="dropdown-item">8.软件定时器</a>
</li>
                                    
<li>
    <a href="../../../UserManual/09-PM/" class="dropdown-item">9.电源管理</a>
</li>
                                    
<li>
    <a href="../../../UserManual/10-Lock/" class="dropdown-item">10.锁</a>
</li>
                                    
<li>
    <a href="../../../UserManual/11-Sync/" class="dropdown-item">11.同步</a>
</li>
                                    
<li>
    <a href="../../../UserManual/12-MM/" class="dropdown-item">12.内存管理</a>
</li>
                                    
<li>
    <a href="../../../UserManual/13-C-Lib/" class="dropdown-item">13.玄武C库</a>
</li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">Lua手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../../LuaManual/00-Index/" class="dropdown-item">0.目录</a>
</li>
                                    
<li>
    <a href="../../../LuaManual/01-Brief/" class="dropdown-item">1.简介</a>
</li>
                                    
<li>
    <a href="../../../LuaManual/02-XWXT/" class="dropdown-item">2.全局导出表</a>
</li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">3.XWOS内核</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../LuaManual/03-XWOS/01-SDK/" class="dropdown-item">3.1.线程库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/02-Spinlock/" class="dropdown-item">3.2.自旋锁库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/03-Seqlock/" class="dropdown-item">3.3.顺序锁库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/04-Mutex/" class="dropdown-item">3.4.互斥锁库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/05-Semaphore/" class="dropdown-item">3.5.信号量库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/06-Condition/" class="dropdown-item">3.6.条件量库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/07-Flag/" class="dropdown-item">3.7.事件标志库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/08-Barrier/" class="dropdown-item">3.8.线程栅栏库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/09-Selector/" class="dropdown-item">3.9.信号选择器库</a>
</li>
            
<li>
    <a href="../../../LuaManual/03-XWOS/10-PM/" class="dropdown-item">3.10.电源管理</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">4.玄武Lua函数库</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../LuaManual/04-XWLIB/01-Bitmap/" class="dropdown-item">4.1.位图</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">5.设备栈</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../LuaManual/05-XWDS/01-Soc/" class="dropdown-item">5.1.SOC</a>
</li>
            
<li>
    <a href="../../../LuaManual/05-XWDS/02-GPIO/" class="dropdown-item">5.2.GPIO</a>
</li>
            
<li>
    <a href="../../../LuaManual/05-XWDS/03-UART/" class="dropdown-item">5.3.UART</a>
</li>
            
<li>
    <a href="../../../LuaManual/05-XWDS/04-SPI-Master/" class="dropdown-item">5.4.SPI Master</a>
</li>
            
<li>
    <a href="../../../LuaManual/05-XWDS/05-IIC-Master/" class="dropdown-item">5.5.IIC Master</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown active">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">移植笔记 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../00-Index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../01-Porting-Note/" class="dropdown-item">移植笔记</a>
</li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">ARM-Cortex-M</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../01-ARM-Cortex-M-Porting-Note/" class="dropdown-item">架构移植笔记</a>
</li>
            
<li>
    <a href="./" class="dropdown-item active">STM32</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">RISC-V</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../03-RISC-V/01-GD32V-Porting-Note/" class="dropdown-item">GD32V</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">规范 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../../Specification/00-Index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../../Specification/01-Git-Commit-Specification/" class="dropdown-item">git-commit规范</a>
</li>
                                    
<li>
    <a href="../../../Specification/02-Version-Branch-Specification/" class="dropdown-item">版本分支规范</a>
</li>
                                </ul>
                            </li>
                        </ul>

                    <ul class="nav navbar-nav ml-auto">
                        <li class="nav-item">
                            <a href="#" class="nav-link" data-toggle="modal" data-target="#mkdocs_search_modal">
                                <i class="fa fa-search"></i> 搜索
                            </a>
                        </li>
                            <li class="nav-item">
                                <a rel="prev" href="../01-ARM-Cortex-M-Porting-Note/" class="nav-link">
                                    <i class="fa fa-arrow-left"></i> 上一篇
                                </a>
                            </li>
                            <li class="nav-item">
                                <a rel="next" href="../../03-RISC-V/01-GD32V-Porting-Note/" class="nav-link">
                                    下一篇 <i class="fa fa-arrow-right"></i>
                                </a>
                            </li>
                    </ul>
                </div>
            </div>
        </div>

        <div class="container">
            <div class="row">
                    <div class="col-md-3"><div class="navbar-light navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
    <div class="navbar-header">
        <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#toc-collapse" title="Table of Contents">
            <span class="fa fa-angle-down"></span>
        </button>
    </div>

    
    <div id="toc-collapse" class="navbar-collapse collapse card bg-secondary">
        <ul class="nav flex-column">
            
            <li class="nav-item" data-level="1"><a href="#stm32" class="nav-link">STM32移植说明</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#1" class="nav-link">1.链接脚本</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#2" class="nav-link">2.中断优先级</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#3soc" class="nav-link">3.SOC的初始化</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#4stm32cubemx" class="nav-link">4.STM32CubeMX</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#41" class="nav-link">4.1.中断向量表</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#42xwac" class="nav-link">4.2.xwac</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#5" class="nav-link">5.附录</a>
              <ul class="nav flex-column">
              </ul>
            </li>
        </ul>
    </div>
</div></div>
                    <div class="col-md-9" role="main">

<h1 id="stm32">STM32移植说明</h1>
<hr />
<p>由于ST官方的STM32CubeMX能自动生成初始化芯片的代码，因此
玄武OS中STM32的<strong>架构描述层(ADL)</strong>、<strong>CPU描述层(CDL)</strong>、<strong>SOC描述层(SDL)</strong>的代码几乎
是一致的，唯一区别在链接脚本。</p>
<h1 id="1">1.链接脚本</h1>
<p>STM32的链接脚本也是按照可复用的方式设计的，分为两部分：</p>
<ul>
<li>SDL中的链接脚本：描述各个段如何分布在镜像文件中<ul>
<li>STM32F0：xwcd/soc/arm/v7m/gcc/m0/stm32/f0.lds</li>
<li>STM32G0：xwcd/soc/arm/v7m/gcc/m0p/stm32/g0.lds</li>
<li>STM32F1：xwcd/soc/arm/v7m/gcc/m3/stm32/f1.lds</li>
<li>STM32L1：xwcd/soc/arm/v7m/gcc/m3/stm32/l1.lds</li>
<li>STM32F4：xwcd/soc/arm/v7m/gcc/m4/stm32/f4.lds</li>
<li>STM32L4：xwcd/soc/arm/v7m/gcc/m4/stm32/l4.lds</li>
<li>STM32F7：xwcd/soc/arm/v7m/gcc/m7/stm32/f7.lds</li>
<li>STM32H7：xwcd/soc/arm/v7m/gcc/m7/stm32/h7.lds</li>
<li>其他SOC还在持续增加中...</li>
</ul>
</li>
<li>BDL中的链接脚本：只描述内存区域<ul>
<li>stm32f072HiXwos工程：xwbd/stm32f072HiXwos/cfg/XuanWuOS.lds</li>
<li>stm32f103c8HiXwos工程：xwbd/stm32f103c8HiXwos/cfg/XuanWuOS.lds</li>
<li>atkh743工程：xwbd/atkh743/cfg/XuanWuOS.lds</li>
<li>atkf103core工程：xwbd/atkf103core/cfg/XuanWuOS.lds</li>
<li>atkf407core工程：xwbd/atkf407core/cfg/XuanWuOS.lds</li>
<li>fk429m工程：xwbd/fk429m/cfg/XuanWuOS.lds</li>
<li>其他电路板还在持续增加中...</li>
</ul>
</li>
</ul>
<p>不同的电路板工程，只有Board中链接脚本中的Memory区域不同。</p>
<hr />
<h1 id="2">2.中断优先级</h1>
<ul>
<li>玄武OS对中断优先级的要求：</li>
</ul>
<pre><code>切换上下文的中断 &lt;= 滴答定时器的中断 &lt; 调度器服务中断
切换上下文的中断 &lt; 其他中断 &lt; 调度器服务中断
</code></pre>

<ul>
<li>NVIC设置<ul>
<li>设置3个抢占优先级位和1个子优先级位</li>
<li>SVC中断设置成<strong>最高</strong>优先级，即<strong>Preemption Priority</strong>为0；</li>
<li>PendSV中断设置成<strong>最低</strong>优先级，即<strong>Preemption Priority</strong>为7；</li>
<li>Systick中断设置成<strong>最低</strong>优先级，即<strong>Preemption Priority</strong>为7；</li>
<li>系统Fault的优先级设置为0；</li>
<li>其他中断的优先级只可在<strong>1~6</strong>之间。</li>
</ul>
</li>
</ul>
<p><img alt="img" src="../../../QuickGuide/stm32/res/figure/STM32-IRQ-Priority.png" title="中断优先级" /></p>
<hr />
<h1 id="3soc">3.SOC的初始化</h1>
<p>STM32的初始化，放在<code>stm32cube_lowlevel_init</code>与<code>stm32cube_init()</code>中去执行，
这两个函数在<a href="../../../UserManual/04-Boot-Flow/">启动流程</a>中分别
被<code>board_lowlevel_init</code>与<code>board_init()</code>调用，
它们又会调用STM32CubeMX生成的代码。</p>
<p><img alt="img" src="../../../QuickGuide/stm32/res/figure/stm32-boot-flow.png" title="STM32启动流程" /></p>
<hr />
<h1 id="4stm32cubemx">4.STM32CubeMX</h1>
<p>STM32CubeMX工程是以<strong>玄武模块</strong>中的<strong>电路板模块</strong>的方式进行集成的，
详细可参考<a href="../../../UserManual/03-Build-System/">构建系统</a>。</p>
<p>各个工程的STM32CubeMX工程如下（可在STM32CubeMX中打开）：</p>
<ul>
<li>stm32f072HiXwos工程：xwbd/stm32f072HiXwos/bm/stm32cube/cubemx/stm32f072HiXwos.ioc</li>
<li>stm32f103c8HiXwos工程：xwbd/stm32f103c8HiXwos/bm/stm32cube/cubemx/stm32f103c8HiXwos.ioc</li>
<li>atkh743工程：xwbd/atkh743/bm/stm32cube/cubemx/atkh743.ioc</li>
<li>atkf103core工程：xwbd/atkf103core/bm/stm32cube/cubemx/atkf103core.ioc</li>
<li>atkf407core工程：xwbd/atkf407core/bm/stm32cube/cubemx/atkf407core.ioc</li>
<li>fk429m工程：xwbd/fk429m/bm/stm32cube/cubemx/fk429m.ioc</li>
</ul>
<h2 id="41">4.1.中断向量表</h2>
<p>STM32CubeMX生成的代码中断向量表是放在<strong>startup.s</strong>中，玄武OS并不使用这个文件，因此需要
另外增加中断向量表。STM32型号太多，一个一个编辑工作量巨大，但观察STM32寄存器定义的
头文件（例如：<code>stm32h743xx.h</code>），可以发现<code>IRQn_Type</code>这个枚举类型，其中列举了
所有的中断号，因此可使用脚本自动生成中断向量表的代码。</p>
<p>作者编写了一个Emacs-Lisp脚本<code>xwbs/util/el/stm32ivt/stm32ivt.el</code>来完成这项工作，
用法：</p>
<pre><code class="shell">xwbs/util/el/stm32ivt/stm32ivt.el xwbd/[电路板名称]/bm/stm32cube
</code></pre>

<ul>
<li>需要注意脚本指定的路径为<code>cubemx</code>的父目录<code>stm32cube</code>；</li>
<li>脚本执行完成后，会生成名为<code>IVT</code>的文件夹；</li>
<li>此脚本能自动获取芯片型号等信息；</li>
<li>生成的两个<code>.c</code>文件需要写入<code>xwmo.mk</code>。</li>
</ul>
<pre><code class="Makefile">CUBEMX_CSRCS += IVT/isr.c
CUBEMX_CSRCS += IVT/ivt.c
</code></pre>

<h2 id="42xwac">4.2.xwac</h2>
<p>文件夹<code>xwac</code>中存放的都是适配性质的代码，命名<code>ac</code>是<code>Adaptation Code</code>的
缩写。其中定义的都是与电路板相关的代码，例如：</p>
<ul>
<li><code>cxx</code>：C++的<code>new</code>关键字的内存池；</li>
<li><code>fatfs</code>：fatfs底层设备驱动；</li>
<li><code>lua</code>：lua虚拟机的内存池；</li>
<li><code>newlib</code>：<ul>
<li><code>malloc()</code>函数的内存池；</li>
<li>定义<code>printf()</code>打印消息的串口；</li>
</ul>
</li>
<li><code>xwos</code>：玄武OS内核的Hook函数。</li>
</ul>
<h1 id="5">5.附录</h1>
<ul>
<li><a href="../../00-Index/">返回目录</a></li>
</ul></div>
            </div>
        </div>

        <footer class="col-md-12">
            <hr>
            <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
        </footer>
        <script>
            var base_url = "../../..",
                shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
        </script>
        <script src="../../../js/base.js" defer></script>
        <script src="../../../search/main.js" defer></script>

        <div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="searchModalLabel">搜索</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
                <p>
                    在这里所有文档：
                </p>
                <form>
                    <div class="form-group">
                        <input type="search" class="form-control" placeholder="搜索..." id="mkdocs-search-query" title="Type search term here">
                    </div>
                </form>
                <div id="mkdocs-search-results"></div>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
              <table class="table">
                <thead>
                  <tr>
                    <th style="width: 20%;">Keys</th>
                    <th>Action</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td class="help shortcut"><kbd>?</kbd></td>
                    <td>Open this help</td>
                  </tr>
                  <tr>
                    <td class="next shortcut"><kbd>n</kbd></td>
                    <td>Next page</td>
                  </tr>
                  <tr>
                    <td class="prev shortcut"><kbd>p</kbd></td>
                    <td>Previous page</td>
                  </tr>
                  <tr>
                    <td class="search shortcut"><kbd>s</kbd></td>
                    <td>Search</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>

    </body>
</html>
